﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Marin.Entities;
using Marin.Service;

namespace Marin.UI
{
    public partial class frmMttoEgreso : Form
    {
        private ICuentaService cuentaService;
        private IEgresoService egresoService;
        bool IsNew = true;
        public frmMttoEgreso()
        {
            InitializeComponent();
            cuentaService= new CuentaService();
            egresoService = new EgresoService();
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            var criterio = txtCriterio.Text == string.Empty ? null : txtCriterio.Text;
            
            cuentaBindingSource.DataSource = cuentaService.GetAllFromCuentasByCriterio(criterio);
        }

        public void AddNuevoEgreso()
        {
            egresoBindingSource.AddNew();
        }

        public Egreso _Egreso { get; set; }
        private void btnAdd_Click(object sender, EventArgs e)
        {
            var cuenta = cuentaBindingSource.Current as Cuenta;
            var currentCuenta= egresoBindingSource.Current as Egreso;

            if (cuenta != null)
            {
                var detalle = new DetalleEgreso()
                {
                    IdEgreso = currentCuenta.Id,
                    IdCuenta = cuenta.Id,
                    Egreso = currentCuenta,
                    Cuenta = cuenta,
                    Cantidad = 1,
                    PrecioUnt = cuenta.Precio
                };

              currentCuenta.DetalleEgresoes.Add(detalle);
                    currentCuenta.Total =
                        currentCuenta.DetalleEgresoes.Sum(dp => dp.Monto);
              



                egresoBindingSource.ResetBindings(true);
                detalleEgresoesBindingSource.ResetBindings(true);
            }
        }

        private void frmMttoEgreso_Load(object sender, EventArgs e)
        {
            totalLabel1.Text = "0.00";
        }

        public void _UpdateEgreso()
        {
            IsNew = false;
            egresoBindingSource.DataSource = _Egreso;
        }

        public void UpdateEgreso(Int32 id)
        {
            IsNew = false;
            var egreso = egresoService.GetFromEgresoById(id);
            egresoBindingSource.DataSource = egreso;
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            var egreso = egresoBindingSource.Current as Egreso;
            egreso.Fecha = fechaDateTimePicker.Value;
            if (egreso != null)
            {
                try
                {
                    if (IsNew)
                    {
                        if (egreso.Total>0)
                        {
                            egresoService.AddEgreso(egreso);
                            IsNew = false;
                            MessageBox.Show(this, "Registro Correcto",
                                "Mensaje",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Information);
                            CalcularSaldo();
                            Close();
                        }
                        else
                        {
                            MessageBox.Show("El total debe ser mayor a cero, Verificar por favor..!!");
                        }
                    }
                    else 
                    {
                        if (egreso.Total>0)
                        {
                            egresoService.UpdateEgreso(egreso);
                            _UpdateEgreso();
                            MessageBox.Show(this, "Actualización Correcta",
                                "Mensaje",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Information);
                            CalcularSaldo();
                            Close();
                        }
                        else
                        {
                            MessageBox.Show("El total debe ser mayor a cero, Verificar por favor..!!");
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(this, ex.Message,
                        "Mensaje",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Stop);
                }
            } 
        }
        private void CalcularTotal()
        {
            var egreso = egresoBindingSource.Current as Egreso;

            if (egreso != null)
            {
                egreso.Total = egreso.DetalleEgresoes.Sum(dp => dp.Monto);

                egresoBindingSource.ResetBindings(true);
            }
        }

        public void CalcularSaldo()
        {
            var egreso = egresoBindingSource.Current as Egreso;

            if (egreso!=null)
            {
                egreso.Saldo =egreso.Saldo + egreso.Total;
                egresoBindingSource.ResetBindings(true);
            }
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            var detalle = detalleEgresoesBindingSource.Current as DetalleEgreso;

            if (detalle!=null)
            {
                var rpt = MessageBox.Show(this,
                    string.Format("Desea quitar la cuenta: {0}, del Egreso???",
                                    detalle.Cuenta.Descripcion),
                    "Mensaje",
                    MessageBoxButtons.YesNo,
                    MessageBoxIcon.Question);

                if (rpt == DialogResult.Yes)
                {
                    detalleEgresoesBindingSource.RemoveCurrent();
                    CalcularTotal();
                    CalcularSaldo();
                }
            }
            else
            {
                MessageBox.Show("Debe sellecionar una cuenta");
            }
        }

        private void btnNuevo_Click(object sender, EventArgs e)
        {
            var frmCuenta = new frmMttCuenta();
            frmCuenta.AddCuenta();
            frmCuenta.ShowDialog();
        }

        private void detalleEgresoesDataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            CalcularTotal();
            CalcularSaldo();
        }
    }
}
